package singletontest;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * 我们可以针对某些重要的代码进行单独的同步，而其他的代码则不需要同步。这样在运行时，效率完全可以得到大幅度提升。
 *
 * @author liuziyang
 * @create 2019-10-14 20:25
 */
public class SingletonTest5 {
    private static SingletonTest5 myObject;

    public SingletonTest5() {
    }

    public static SingletonTest5 getInstance() {
        try {
            if (myObject == null) {
                //模拟对象在创建之前做的一些准备工作
                Thread.sleep(3000);
                synchronized (SingletonTest5.class) {
                    myObject = new SingletonTest5();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return myObject;
    }


    /**
     * 此方法只对实例化对象的关键代码进行同步，从语句的结构上来说，运行的效率的确得到的提升。但是在多线程的情况下依旧无法解决得到一个单例对象的结果。
     *
     * @param args
     */
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest5.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest5.getInstance().hashCode());
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(SingletonTest5.getInstance().hashCode());
            }
        }).start();
    }

}

